#include"pm_ehash.h"

// 数据页表的相关操作实现都放在这个源文件下，如PmEHash申请新的数据页和删除数据页的底层实现



data_page* newPage(uint64_t max_file_id, size_t & tmap_len){
//每次调用，向这个函数传递一个文件序号，如果是已有的文件，将打开该文件，如果是没有的文件，将创建一个新文件，并返回指向这个文件的指针,和所创建的文件的实际大小。由于我们使用data_page来创建文件，因此这个文件的指针可以当作一个指向data_page对象的指针。

	char num[25];
	char path[128] = DATA;
	sprintf(num, "%ld", max_file_id);
	strcat(path, num);
	size_t map_len;
	int is_pmem;
	data_page * res = (data_page*)pmem_map_file(path, sizeof(data_page), PMEM_FILE_CREATE,0777, &map_len, &is_pmem);

	if(res == NULL){
            cout << "res is NULL" << endl;
    }

	for( int i = 0; i < DATA_PAGE_SLOT_NUM; ++i){
		res->bitmap[i] = 0;
		for( int j = 0; j < BUCKET_SLOT_NUM; ++j){
			res->slot[i].bitmap[j] = 0;
		}
	}

	res->page_num = max_file_id;
	tmap_len = map_len;

	return res;
}

bool deletePage(data_page * file_to_delete, int file_id){
//给这个函数要删除的页面表的指针，以及这个页面表的大小，以及页面表的序号，如果删除成功，返回true，如果删除失败，返回false。

	pmem_unmap(file_to_delete, sizeof(data_page));
	char num[25];
	char path[128] = DATA;
    sprintf(num, "%d", file_id);
	strcat(path, num);

	if(::remove(path) == 0)
        return true;
	else
        return false;
}
